/* =============================================================================
PROJET           : c-social-network
NOM DU FICHIER   : test_personne.c
OBJET            : tester du module personne
--------------------------------------------------------------------------------
DATE DE CREATION : 27/04/10
AUTEUR           : Benjamin MICHEL
--------------------------------------------------------------------------------
MODIFICATIONS (   n) date - auteur - description )
    1) 28/04/10 - Benjamin MICHEL - création de la fonction cre_init_vide
============================================================================= */

#include <stdio.h>

#include "../../lib/personne/personne.h"
/*
======
Déclarations
======
*/

/*
Création, initialisation, vide, delete
*/
int cre_init_vide(void);

/*
Is identique
*/
int identique(void);

/*
Liste
*/
int liste_check(void);

/*====
Fonction main de testes*/
int main (void){
    cre_init_vide();
    identique();
    liste_check();
    return 0;
}

/*
Création, initialisation, vide, delete
*/
int cre_init_vide(){
    char nom_origine[MAX_NOM_PERSONNE]="moi";/* chaine pour initialiser le nom */
    char *mon_nom = (char *) NULL;/* chaine pour récupérer le nom */

    /*création de la personne*/
    t_personne *pers = NULL;

    /*Début test*/
    printf("\n===========\nDébut creation initialisation vide destroy\n==========\n");

    /*Si la structure est vide*/
    printf("\nAvant init: ");
    if (f_personne.is_vide(pers))
        printf("je suis vide");
    else
        printf("je ne suis pas vide");

    /*initialisationde la personne*/
    pers = f_personne.creer(3, nom_origine, 5);

    /*Si la structure est vide après l'initialisation*/
    printf("\nAprès init: ");
    if (f_personne.is_vide(pers))
        printf("je suis vide");
    else
        printf("je ne suis pas vide");

    /* Récupérer le nom */
    f_personne.get_nom(pers, &mon_nom);

    /*Afficher id, fréquence, nom*/
    printf("\n\nJe suis le numéro : \"%d\"", f_personne.get_id(pers));
    printf("\nJ'ai une fréquence de : \"%d\"", f_personne.get_frequence(pers));
    printf("\nJe m'appel: \"%s\"\n", mon_nom);

    /*si la structure est vide*/
    printf("\nAvant delete: ");
    if (f_personne.is_vide(pers))
        printf("je suis vide");
    else
        printf("je ne suis pas vide");

    /*suppression de la structure*/
    f_personne.destroy(&pers);

    /*si la structure est vide*/
    printf("\nAprès delete: ");
    if (f_personne.is_vide(pers))
        printf("je suis vide");
    else
        printf("je ne suis pas vide");

    /*fin test*/
    printf("\n===========\nFin test\n==========\n");
    return 0;
}


int identique(){
    char nom_origine[MAX_NOM_PERSONNE]="moi                ";/* chaine pour initialiser le nom */

    /*création de deux personnes*/
    t_personne *pers1 = NULL;
    t_personne *pers2 = NULL;

    printf("\n===========\nDébut identique\n==========\n");

    /*Initialisation des personnes*/
    pers1 = f_personne.creer(3, nom_origine, 5);
    pers2 = f_personne.creer(3, nom_origine, 5);
    /*On note que les données sont les mêmes!*/

    printf("\nOn fait deux instances de personnes avac les même données\n");

    /*test de l'égalité*/
    if (f_personne.is_identique(pers1, pers2))
        printf("\nles deux personnes sont identiques\n");
    else
        printf("\nles deux personnes sont différentes\n");

    printf("\nOn fait pointer les deux personnes vers le même objet\n");

    /*suppression de pers2*/
    f_personne.destroy(&pers2);

    pers2 = pers1;

    /*test de l'égalité*/
    if (f_personne.is_identique(pers1, pers2))
        printf("\nles deux personnes sont identiques\n");
    else
        printf("\nles deux personnes sont différentes\n");

    /*suppression de pers1*/
    f_personne.destroy(&pers1);
    /*fin test*/
    printf("\n===========\nFin test\n==========\n");
    return 0;
}

int liste_check(){
    /*déclaration d'un tableau qui contient 4 personnes*/
    t_personne* tab[4];
    /*initialise 4 noms*/
    char nom1[MAX_NOM_PERSONNE] = "A",
        nom2[MAX_NOM_PERSONNE] = "B",
        nom3[MAX_NOM_PERSONNE] = "C",
        nom4[MAX_NOM_PERSONNE] = "D";
    int i;/*iteration*/
    register t_personne **i_tab;/*iteration sur tableau*/
    char *nom_temp = (char *) NULL;/* chaine pour récupérer le nom */

    printf("\n===============\nDébut liste_check\n===========\n");

    /*initialisation du tableau*/
    printf("\nInitialisation tableau");
    /*boucle sur le tableau*/
    for(i_tab = tab; i_tab < tab+4 ; i_tab++)
        *i_tab = NULL;/*met la personne à NULL*/

    printf ("\nInitialisation personnes");
    /*initialisation personnes*/
    tab[0] = f_personne.creer(1, nom1, 10);
    tab[1] = f_personne.creer(2, nom2, 10);
    tab[2] = f_personne.creer(3, nom3, 10);
    tab[3] = f_personne.creer(4, nom4, 10);

    /*
    Schéma:
    l1:A > B,C
    l2:B > C,D
    l3:C > D,A
    l4:D > A,B,C
    */
    printf("\nInitialisation listes");
    /*boucle sur le tableau de personnes*/
    for(i_tab = tab; i_tab < tab+4; i_tab++){
        (*i_tab)->conf = NULL;/*met la liste à NULL*/
        (*i_tab)->conf = f_liste.creer();/*créé une liste*/
    }

    /*remplissage liste*/
    f_liste.ajout_pers(&(tab[0]->conf), tab[1]);
    f_liste.ajout_pers(&(tab[0]->conf), tab[2]);

    f_liste.ajout_pers(&(tab[1]->conf), tab[2]);
    f_liste.ajout_pers(&(tab[1]->conf), tab[3]);

    f_liste.ajout_pers(&(tab[2]->conf), tab[3]);
    f_liste.ajout_pers(&(tab[2]->conf), tab[0]);

    f_liste.ajout_pers(&(tab[3]->conf), tab[0]);
    f_liste.ajout_pers(&(tab[3]->conf), tab[1]);
    f_liste.ajout_pers(&(tab[3]->conf), tab[2]);

    /*affiche les dépendances*/
    printf("\n\nPersonnes et dépendances:\n");
    /*initialise l'élément iterant à la première valeur*/
    i_tab = tab;
    /*Pour chaque personnes dans tab*/
    while(i_tab < tab+4){
        /*met le pointeur sur NULL*/
        nom_temp = (char *)NULL;
        /*récupère le nom*/
        f_personne.get_nom(*i_tab, &nom_temp);
        /*l'affiche*/
        printf("\t-%s>", nom_temp);
        /*libère l'espace du nom*/
        free(nom_temp);
        /*pour chaque personnes en qui la personne séléctionnée fait confiance*/
        while( !f_liste.is_vide( (*i_tab)->conf ) ){
            /*met le pointeur sur NULL*/
            nom_temp = (char *)NULL;
            /*récupérer le nom*/
            f_personne.get_nom( f_liste.get_pers( (*i_tab)->conf  ), &nom_temp );
            /*L'afficher*/
            printf("%s,", nom_temp);
            /*libère le string utilisé*/
            free(nom_temp);
            /*passe à la personne suivante*/
            (*i_tab)->conf = f_liste.get_next( (*i_tab)->conf );
        }
        printf("\n");
        /*passe à la personne suivante*/
        i_tab++;
    }
    printf("\n");
    /*suppression*/
    printf("\ndestruction personnes\n");
    /*boucle sur le tableau de personnes*/
    for (i_tab = tab; i_tab < tab+4; i_tab++)
        f_personne.destroy(i_tab);/*détruit chaque personnes*/

    /*fin test*/
    printf("\n===========\nFin test\n==========\n");
    return 0;
}


